#include "mymessage.h"
#include "ui_mymessage.h"
#include <QTextCursor>
#include <QDateTime>
#include "pack.h"
#include "frienditem.h"
#include <QMessageBox>
// 添加必要的头文件
#include <QScrollBar>

myMessage::myMessage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::myMessage)
{
    ui->setupUi(this);
}

myMessage::~myMessage()
{
    delete ui;
}

void myMessage::showReceivedMessage(const QString &sender, const QString &msg, const QString &time, bool showTime)
{
    // 添加过滤：如果发送者是自己，则不显示
    if (sender == currentUsername) {
        qDebug() << "忽略自己发送的消息，sender=" << sender << "，currentUsername=" << currentUsername;
        return;
    }

    qDebug() << "收到消息：发送者=" << sender << "，当前聊天对象=" << currentChatUser << "，消息内容=" << msg;

    // 如果当前没有选择聊天对象，或者消息是发给当前聊天对象的，则显示
    bool shouldShow = currentChatUser.isEmpty() || currentChatUser == sender;
    qDebug() << "是否显示消息：" << shouldShow;

    if (shouldShow) {
        if (showTime) {
            ui->textBrowser->append(QString("[%1]").arg(time));
        }
        addMessageToChat(QString("%1: %2").arg(sender).arg(msg), QColor(0, 0, 255), Qt::AlignLeft);
    } else {
        qDebug() << "消息不是发给当前聊天对象的，忽略";
    }

    chatHistory[sender].append(QString("[%1] %2: %3").arg(time).arg(sender).arg(msg));
}

// 修复setSocket方法中的语法错误
void myMessage::setSocket(QTcpSocket *s)
{
    socket = s;

}


// 只保留4参数版本
void myMessage::addMessageToChat(const QString &sender, const QString &message, const QString &time, bool isSelf)
{
    QTextCursor cursor = ui->textBrowser->textCursor();
    cursor.movePosition(QTextCursor::End);

    // 设置文本格式
    QTextCharFormat format;
    if (isSelf) {
        format.setForeground(Qt::blue); // 自己发送的消息为蓝色
        cursor.insertText(QString("[%1] 我: ").arg(time), format);
    } else {
        format.setForeground(Qt::red); // 收到的消息为红色
        cursor.insertText(QString("[%1] %2: ").arg(time).arg(sender), format);
    }

    // 插入消息内容
    format.setForeground(Qt::black);
    cursor.insertText(message + "\n", format);

    ui->textBrowser->setTextCursor(cursor);
    ui->textBrowser->verticalScrollBar()->setValue(ui->textBrowser->verticalScrollBar()->maximum());
}


void myMessage::on_onlineList_itemClicked(QListWidgetItem *item)
{
    // 忽略无效项（如标题项）
    if (!item) return;

    // 获取选中的用户名（从自定义friendItem中提取）
    friendItem* friendWidget = qobject_cast<friendItem*>(ui->onlineList->itemWidget(item));
    if (!friendWidget) return; // 确保是有效的好友项

    QString selectedUser = friendWidget->getFriendName(); // 需要在friendItem中添加getter方法
    qDebug() << "选中的用户：" << selectedUser;
    if (selectedUser.isEmpty() || selectedUser == currentChatUser) return; // 避免重复切换

    // 更新当前聊天对象
    currentChatUser = selectedUser;
    qDebug() << "当前聊天对象更新为：" << currentChatUser;

    // 更新窗口标题
    setWindowTitle(QString("与 %1 聊天").arg(currentChatUser));

    // 切换聊天内容：清空当前窗口并加载历史记录
    ui->textBrowser->clear();
    if (chatHistory.contains(currentChatUser)) {
        for (const QString &msg : chatHistory[currentChatUser]) {
            ui->textBrowser->append(msg); // 显示历史消息
        }
        // 滚动到底部
        ui->textBrowser->moveCursor(QTextCursor::End);
    }
}

void myMessage::addMessageToChat(const QString &text, const QColor &color, Qt::Alignment alignment)
{
    // 保存当前光标位置
    QTextCursor cursor = ui->textBrowser->textCursor();
    cursor.movePosition(QTextCursor::End);

    // 设置对齐方式
    QTextBlockFormat blockFormat = cursor.blockFormat();
    blockFormat.setAlignment(alignment);
    cursor.setBlockFormat(blockFormat);

    // 设置文本颜色
    QTextCharFormat charFormat = cursor.charFormat();
    charFormat.setForeground(color);
    cursor.setCharFormat(charFormat);

    // 插入文本
    cursor.insertText(text);
    cursor.insertBlock(); // 换行

    // 更新光标并滚动到底部
    ui->textBrowser->setTextCursor(cursor);
    ui->textBrowser->ensureCursorVisible(); // 确保光标可见
    qDebug() << "添加消息到聊天窗口：" << text;
}

// 实现closeEvent函数
void myMessage::closeEvent(QCloseEvent *event)
{
    // 这里添加关闭窗口时的处理逻辑
    event->accept(); // 接受关闭事件
}

void myMessage::on_pushButton_send_clicked()
{
    QString msgContent = ui->textEdit->toPlainText();
    if (msgContent.isEmpty()) {
        QMessageBox::warning(this, "提示", "消息不能为空");
        return;
    }

    // 获取当前时间
    QDateTime currentTime = QDateTime::currentDateTime();
    QString timeStr = currentTime.toString("yyyy-MM-dd hh:mm:ss");

    // 打包消息
    Pack pack;
    pack.setType(TYPE_MESSAGE);
    // 发送4个字段：sender、targetUser、message、time
    pack << currentUsername << currentChatUser << msgContent << timeStr;
    // 发送消息
    pack >> socket;

    // 在自己的聊天窗口显示发送的消息
    addMessageToChat(currentUsername, msgContent, timeStr, true);

    // 清空输入框
    ui->textEdit->clear();
}

void myMessage::on_pushButton_exit_clicked()
{
    this->close();
}

void myMessage::updateOnlineListUI(const QStringList &users)
{
    ui->onlineList->clear(); // 清空现有列表

    for (const QString& username : users) {
        // 创建自定义列表项（使用friendItem）
        friendItem* itemWidget = new friendItem(ui->onlineList); // 指定父控件
        itemWidget->setFriendName(username);
        itemWidget->setFriendStatus(true);
        itemWidget->setHeadImage(":/default_avatar.png");

        // 确保自定义控件有合适的大小
        itemWidget->setMinimumSize(200, 60); // 设置最小尺寸确保可见

        QListWidgetItem* item = new QListWidgetItem(ui->onlineList);
        item->setSizeHint(itemWidget->sizeHint()); // 设置合适的大小提示
        ui->onlineList->setItemWidget(item, itemWidget);
    }

    // 强制刷新布局
    ui->onlineList->updateGeometry();
    ui->onlineList->update();
}

void myMessage::handleOnlineList(const Pack& pack) {
    // 从数据包中读取在线用户列表（服务器写入的是QStringList）
    QStringList onlineUsers = pack.readAll(); // 假设Pack有readAll()返回QStringList
    updateOnlineListUI(onlineUsers);
}

void myMessage::setCurrentUsername(const QString &username)
{
    currentUsername = username;
}
